package find.indices.that.is.equal.value;

import java.util.HashMap;
import java.util.Map;

/**
 * @Time 2019/12/18
 * @author 王光浩
 * @Need   给出一个数组和一个target，找出两个下标，这两个下标对应的数组元素值相加为traget，下标值唯一且确定。
 *        （不能重复使用一个同一个下标元素）
 * @Thingk 使用HashMap，key值为数组中元素值，value为对元素值对应的下标。
 *         完成的方法如下：首先将数组中的元素入hashMap，然后循环遍历数组找出hashMap中key等于target-nums[i]且value不等于
 *         i的value。
 * @Steps  (1)创建对应的HashMap集合，将数组中的元素依次加入到HashMap中
 *         (2)遍历数组，查找target-nums[i]是否在HashMap的key中，如果在判断对应的value是否和i相同，不相同的话返回key和i
 *         时间复杂度分析：O（n），空间复杂度O（n）
 * @Improve 在上面的方法中我们进行了一个hashMap.contains（）的判断，这个判断是多余的，我们可以将其移除，只需要判断
 *          hashMap.get()的返回值是否为空（当key不存在是get方法返回的是null，否则返回对应key的value）
 *         
 */
public class MyMethod {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer,Integer> hashMap=new HashMap<Integer,Integer>();  //创建对应的集合
        int len=nums.length;
        int[] result=new int[2];
        int tem=0;     //用于保存符合要求的数组元素下标
        
        //将数组中的元素以元素值——对应元素的下标形式加入到hashMap中
        for(int i=0;i<len;i++) {
        	hashMap.put(nums[i], i);
        }
        for(int i=0;i<len;i++) {
        	//判断key是否存在于hashMap中且如果存在对应的下标是否等于i
        	if(hashMap.get(target-nums[i])!=null && (tem=hashMap.get(target-nums[i]))!=i) {
        		result[0]=tem;
        		result[1]=i;
        		return result;
        	}
        }
        throw new IllegalArgumentException("no such two numbers");
    }
}
